אלגוריתמים סמסטר א' תשע"ב מרצים: פרופ' עמוס פיאט ופרופ' מיכה שריר. מתרגלים: שי ורדי ואדם שפר. תוכן הקורס מבוא: גרפים: הגדרות וייצוג גרפים במחשב. שימושים לגרפים. עצים, יערות ותכונותיהם הבסיסיות חזרה. גרפי אוילר: מעגל אוילר ומסלול אוילר. )מעגל המילטון ומסלול המילטון.( סריקת גרפים: חיפוש לרוחב (BFS) ושימושיו: מציאת מסלולים קצרים ביותר בקשתות. חיפוש לעומק,(DFS) עץ DFS ותכונותיו, שימושים ל- :DFS בגרף לא מכוון: מציאת רכיבי דו-קשירות ומציאת גשרים. בגרף מכוון: מציאת רכיבי קשירות חזקה ומיון טופולוגי של גרף אציקלי. עץ פורש מינימלי: מציאת עץ פורש מינימלי: האלגוריתמים של Kruskal ו-.Prim מסלולים קצרים ביותר בגרפים עם משקלים: מציאת מסלולים קצרים ביותר מקודקוד נתון: האלגוריתמים של Dijkstra ו-.Bellman-Ford מציאת מסלולים קצרים ביותר מכל קודקוד לכל קודקוד: כפל מטריצות,.Johnson,Floyd-Warshall תכנות דינאמי. זרימה ברשתות: רשתות זרימה, האלגוריתם של,Ford-Fulkerson משפט,Max Flow Min Cut האלגוריתם של Edmonds-Karp והאלגוריתם של.Dinic רשתות 0-1, מספר מקסימלי של מסלולים זרים בקשתות ובקודקודים, קשירות קשתות וקודקודים, זיווג מקסימלי בגרף דו-צדדי ומשפט.Hall תכנות לינארי. התאמת מחרוזות: בעיית התאמת מחרוזות, האלגוריתם הנאיבי ו-.KMP
EULER(graph G=(V,E) ) // Find an Euler circuit. L {v} // vv any vertex,{v} - an empty circuit while there is a vertex on L with unused edges v first such vertex on L L Find-Circuit(v) paste L into L instead of v return L FIND-CIRCUIT(v 0 ) // Find a circuit starting at v 0. Return list of vertices. L {v 0 } v v 0 // initialize list repeat u a neighbour of v via an unused edge mark (v,u) used L Append(L,u) v u until v = v 0 return L total complexity O(E+V)
BFS & DFS BFS(G,s) 1 for each vertex u V {s} 2 do color[u] WHITE 3 d[u] 4 [u] NIL 5 color[s] GRAY 6 d[s] 0 7 [s] NIL 8 Q {s} 9 while Q Ø 10 do u head[q] 11 for each v Adj[u] 12 do if color[v] = WHITE 13 then color[v] GRAY 14 d[v] d[u] + 1 15 [v] u 16 ENQUEUE(Q,v) 17 DEQUEUE(Q) 18 color[u] BLACK DFS(G) 1 for each vertex u V 2 do color[u] WHITE 3 [u] NIL 4 time 0 5 for each vertex u V 6 do if color[u] = WHITE 7 Then DFS-VISIT(u) DFS-VISIT(u) 1 color[u] GRAY 2 d[u] time time + 1 3 for each v Adj[u] 4 do if color[v] = WHITE 5 then [v] u 6 DFS-VISIT(v) 7 color[u] BLACK 8 f[u] time time + 1
Minimum Spanning Trees MST-KRUSKAL(G,w) 1 A Ø 2 for each vertex v V 3 do MAKE-SET(v) 4 sort E by nondecreasing weight w 5 for each edge (u,v) E, by nondecreasing weight order 6 do if FIND-SET(u) FIND-SET(v) 7 then A A {(u,v)} 8 UNION(u,v) 9 return A MST-PRIM(G,w,r) 1 Q V 2 for each u Q 3 do key[u] 4 key[r] 0 5 [r] NIL 6 while Q Ø 7 do u EXTRACT-MIN(Q) 8 for each v Adj[u] 9 do if v Q and w(u,v) < key[v] 10 then [v] u 11 key[v] w(u,v)
UNION-FIND data structure for disjoint sets מבנה נתונים המייצג אוסף של קבוצות זרות. לכל קבוצה יש שם ייחודי )נציג הקבוצה( הנבחר בצורה חפשית על ידי מנגנון מבנה הנתונים. תומך בפעולות הבאות : MakeSet(v) create set {v}. Find(v) return the set-name of v. Union(u,v) unite sets containing u and v. תזכורת: תורי קדימויות בניית תור עם V איברים הוצאת מינימום הקטנת ערך של מפתח Q.DecreaseKey O(log V) Q.DeleteMin() O(log V) Q.Build O(V log V) עץ חפוש מאוזן O(V) O(1) O(V log V) רשימה ממוינת O(1) O(V) O(V) מערך לא ממוין O(log V) O(log V) O(V) ערימה בינארית O(1) O(log V) O(1) ערימת פיבונצ 'י
Single-Source Shortest Paths INITIALIZE-SINGLE-SOURCE(G,s) 1 for each v V 2 do d[v] 3 [v] NIL 4 d[s] 0 RELAX(u,v,w) 1 if d[v] > d[u] + w(u,v) 2 then d[v] d[u] + w(u,v) 3 [v] u DIJKSTRA(G,w,s) 1 INITIALIZE-SINGLE-SOURCE(G,s) 2 S Ø 3 Q V // priority queue 4 while Q Ø 5 do u EXTRACT-MIN(Q) 6 S S {u} 7 for each v Adj[u] 8 do RELAX(u,v,w) BELLMAN-FORD(G,w,s) 1 INITIALIZE-SINGLE-SOURCE(G,s) 2 for i 1 to V - 1 3 do for each edge (u,v) E 4 do RELAX(u,v,w) 5 for each edge (u,v) E 6 do if d[v] > d[u] + w(u,v) 7 then return FALSE 8 return TRUE
All-Pairs Shortest Paths EXTEND-SHORTEST-PATHS(D,W) 1 n rows[d] 2 let D = (d ij ) be an n n matrix 3 for i 1 to n 4 do for j 1 to n 5 do d ij 6 for k 1 to n 7 do d ij min(d ij,d ik + w kj ) 8 return D SLOW-ALL-PAIRS-SHORTEST-PATHS(W) 1 n rows[w] 2 D (1) W 3 for m 2 to n 1 4 do D (m) EXTEND-SHORTEST-PATHS(D (m 1),W) 5 return D (n-1) FASTER-ALL-PAIRS-SHORTEST-PATHS(W) 1 n rows[w] 2 D (1) W 3 m 1 4 while m < n 1 5 do D (2m) EXTEND-SHORTEST-PATHS(D (m),d (m) ) 6 m 2m 7 return D (m) FLOYD-WARSHALL(W) 1 n rows[w] 2 D (0) W 3 for k 1 to n 4 do for i 1 to n 5 do for j 1 to n 6 do d (k) ij min(d (k 1) ij,d (k 1) ik + d (k 1) kj) 7 return D (n)
JOHNSON(G) 1 compute G =(V,E ), where V = V {s}, E = E {(s,v) v V }, and v V w(s,v) = 0 2 if BELLMAN-FORD(G,w,s) = FALSE 3 then print G contains a negative-weight cycle 4 else for each vertex v V 5 do h(v) δ(s,v) computed by BELLMAN-FORD 6 for each edge (u,v) E 7 do w (u,v) w(u,v) + h(u) h(v) 8 for each vertex u V 9 do run DIJKSTRA(G,w,u) to compute δ (u,v) for all v V 10 for each vertex v V 11 do d uv δ (u,v) + h(v) h(u) 12 return D Ford-Fulkerson FORD-FULKERSON-METHOD(G,s,t) 1 Initialize flow f to 0 everywhere 2 while there exists an augmenting path p 3 do augment flow f along p 4 return f FORD-FULKERSON(G,s,t) // Initialize 1 for each edge (u,v) E(G) 2 do f[u,v] 0 3 f[v,u] 0 // Main loop 4 repeat until f does not change // Construct residual network 5 E f 0 6 for each edge (u,v) E[G] 7 do c f [u,v] c[u,v]-f[u,v] 8 if c f [u,v] > 0 9 then add (u,v) to E f // Augment the flow 10 if there exists a path p from s to t in the residual network G f =(V,E f ) 11 do c f (p) min { c f [u,v] (u,v) p } 12 for each edge (u,v) p 13 do f[u,v] f[u,v]+c f (p) 14 f[v,u] -f[u,v] 15 return f
DINIC
KMP KMP-MATCHER(T,P) 1 n length[t] 2 m length[p] 3 COMPUTE-PREFIX-FUNCTION(P) 4 j 0 5 for i 1 to n 6 do while j > 0 and P[j + 1] T[i] 7 do j [j] 8 if P[j + 1] = T[i] 9 then j j + 1 10 if j = m 11 then print pattern occurs with shift i m 12 j [j] COMPUTE-PREFIX-FUNCTION(P) 1 m length[p] 2 [1] 0 3 k 0 4 for j 2 to m 5 do while k > 0 and P[k + 1] P[j] 6 do k [k] 7 if P[k + 1] = P[j] 8 then k k + 1 9 [j] k 10 return